﻿/*
 QR code library
 https://www.nuget.org/packages/MessagingToolkit.QRCode/
*/

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media.Imaging;
using System.Windows.Forms;
using System.Drawing;
using System.Text;
using MessagingToolkit.QRCode.Codec;
using MessagingToolkit.QRCode.Codec.Data;
using System.IO;

namespace QRCoodeImageFileReader
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        BitmapImage sourceImageFile = null;
        string sourceFileName = "";
        string sourceFileNameWithoutExt = "";

        // MessageBox用変数
        MessageBoxButton button;
        MessageBoxImage icon;
        string messageBoxText;
        string caption;

        Window owner;

        public MainWindow()
        {
            InitializeComponent();
            this.WindowStartupLocation = WindowStartupLocation.Manual;
            owner = this;
            InitMainWindow();
        }

        // 新規作成処理
        private void InitMainWindow()
        {
            sourceImageFile = null;
            sourceFileName = "";
            sourceFileNameWithoutExt = "";
            sourceFile.Text = "";
            imageFileNameDisplay.Text = "";
            chooseImage.SetValue(System.Windows.Controls.Image.SourceProperty, null);
        }

        // 画像選択ボタン
        private void fileChoose_Click(object sender, RoutedEventArgs e)
        {
            string sourceFilePath = OpenDocument();
            if (sourceFilePath != "")
            {
                sourceFile.Text = sourceFilePath;
                try
                {
                    Uri imageuri = new Uri(sourceFilePath, UriKind.Absolute);
                    sourceImageFile = new BitmapImage(imageuri);
                    chooseImage.SetValue(System.Windows.Controls.Image.SourceProperty, sourceImageFile);
                }
                catch (NotSupportedException notsupportedexc)
                {
                    Console.WriteLine(notsupportedexc.ToString());
                }
            }
        }

        // 画像選択ボタンが押されたらファイル選択画面
        private String OpenDocument()
        {
            string filePath = "";
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.FileName = "";
            dlg.DefaultExt = ".png;.jpg;.jpeg;.gif;.bmp";
            dlg.Filter = "Image File|*.png;*.jpg;*.jpeg;*.gif;*.bmp|All Files(*.*)|*.*";
            dlg.ShowDialog();

            filePath = dlg.FileName;

            // ソースファイル名を取り出す
            sourceFileName = System.IO.Path.GetFileName(filePath);
            imageFileNameDisplay.Text = sourceFileName;

            return filePath;
        }

        // 選択画像のテキストボックスが変更されたら処理をする
        private void sourceFile_TextChanged(object sender, TextChangedEventArgs e)
        {
            string sourceFilePath = sourceFile.Text;
            if (sourceFilePath != "")
            {
                try
                {
                    Uri imageuri = new Uri(sourceFilePath, UriKind.Absolute);

                    sourceImageFile = new BitmapImage(imageuri);
                    chooseImage.SetValue(System.Windows.Controls.Image.SourceProperty, sourceImageFile);
                }
                catch (UriFormatException uriformexception)
                {
                    Console.WriteLine("URiFormatException orrured:" + uriformexception.ToString());
                }
                catch (NotSupportedException noSupportedexception)
                {
                    messageBoxText = "Chosen file type invalid.\nPlease choose image file(.bmp/.gif/.jpg/.png).";
                    caption = "Error";
                    button = MessageBoxButton.OK;
                    icon = MessageBoxImage.Error;
                    System.Windows.MessageBox.Show(owner, messageBoxText, caption, button, icon);
                    sourceFileName = "";
                    sourceFileNameWithoutExt = "";
                    sourceFile.Text = "";
                    imageFileNameDisplay.Text = "";
                    Console.WriteLine("NotSupportedException orrured:" + noSupportedexception.ToString());
                }
            }
        }

        // イメージ画像がfailedだったら
        private void chooseImage_ImageFailed(object sender, ExceptionRoutedEventArgs e) { }

        // 選択画像のテキストボックスのドラッグオーバーの処理
        private void sourceFile_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            inputPreviewDragOver(sender, e);
        }

        // 選択画像のテキストボックスのドロップ処理
        private void sourceFile_Drop(object sender, System.Windows.DragEventArgs e)
        {
            inputDrop(sender, e);
        }

        // ファイル名のテキストブロッグのドラッグオーバー処理
        private void imageFileNameDisplay_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            inputPreviewDragOver(sender, e);
        }

        // ファイル名のテキストブロッグにドロップされた時の処理
        private void imageFileNameDisplay_Drop(object sender, System.Windows.DragEventArgs e)
        {
            inputDrop(sender, e);
        }

        // 画像領域にドラッグオーバーされた時の処理
        private void ImageAreaBorder_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            inputPreviewDragOver(sender, e);
        }


        // 画像領域にドロップされた時の処理
        private void ImageAreaBorder_Drop(object sender, System.Windows.DragEventArgs e)
        {
            inputDrop(sender, e);
        }

        // 画像にドラッグオーバーされた時の処理
        private void chooseImage_PreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            inputPreviewDragOver(sender, e);
        }

        // 画像にドロップされた時の処理
        private void chooseImage_Drop(object sender, System.Windows.DragEventArgs e)
        {
            inputDrop(sender, e);
        }

        // ドラッグオーバーされた時の処理
        private void inputPreviewDragOver(object sender, System.Windows.DragEventArgs e)
        {
            if (e.Data.GetData(System.Windows.DataFormats.FileDrop) != null)
            {
                e.Effects = System.Windows.DragDropEffects.Copy;
            }
            else
            {
                e.Effects = System.Windows.DragDropEffects.None;
            }
            e.Handled = true;
        }

        // ドロップされた時の処理
        private void inputDrop(object sender, System.Windows.DragEventArgs e)
        {
            string[] files = e.Data.GetData(System.Windows.DataFormats.FileDrop) as string[];
            if (files != null)
            {
                //最初のファイルのPathを表示
                sourceFileName = Path.GetFileName(files[0]);
                sourceFileNameWithoutExt = Path.GetFileNameWithoutExtension(files[0]);
                imageFileNameDisplay.Text = sourceFileName;
                sourceFile.Text = files[0];
                Console.WriteLine("Drop process");
            }
        }

        // 実行ボタンが押された時の処理
        private void exeButton_Click(object sender, RoutedEventArgs e)
        {
            if (sourceFileName == null)
            {
                messageBoxText = "Please choose the Input Image File.";
                caption = "Error";
                button = MessageBoxButton.OK;
                icon = MessageBoxImage.Warning;
                System.Windows.MessageBox.Show(owner, messageBoxText, caption, button, icon);
                return;
            }
            else
            {
                decodingQRCode();
            }

        }

        // QRコードをデコード
        private void decodingQRCode()
        {
            StringBuilder builder = new StringBuilder();

            if (File.Exists(sourceFile.Text))
            {
                Bitmap src = new Bitmap(sourceFile.Text);

                // Read barcode:
                QRCodeBitmapImage qrCodeBitmapImage = new QRCodeBitmapImage(src);
                QRCodeDecoder decoder = new QRCodeDecoder();
                builder.Append(Path.GetFileName(sourceFile.Text) + " : " + decoder.Decode(qrCodeBitmapImage));
            }
            else if (Directory.Exists(sourceFile.Text))
            {
                string[] files = Directory.GetFiles(sourceFile.Text);
                
                foreach(var srcFile in files)
                {
                    if( srcFile.Contains("jpg") || srcFile.Contains("png"))
                    {
                        Bitmap src = new Bitmap(srcFile);

                        // Read barcode:
                        QRCodeBitmapImage qrCodeBitmapImage = new QRCodeBitmapImage(src);
                        QRCodeDecoder decoder = new QRCodeDecoder();
                        builder.Append(Path.GetFileName(srcFile) + " : " + decoder.Decode(qrCodeBitmapImage) + "\n");
                    }
                }
            }

            resultText.Text = builder.ToString();

        }

        // メニューのNewが押された時の処理
        private void menuNew_Click(object sender, RoutedEventArgs e)
        {
            InitMainWindow();
        }

        // メニューのExitが押された時の処理
        private void menuExit_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

    }
}
